package com.dongliusuo.orangeforms.webadmin.app.dto;

import com.dongliusuo.orangeforms.common.core.validator.UpdateGroup;
import com.dongliusuo.orangeforms.common.core.validator.ConstDictRef;
import com.dongliusuo.orangeforms.application.common.constant.Gender;
import com.dongliusuo.orangeforms.application.common.constant.CertType;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import jakarta.validation.constraints.*;

import java.util.Date;

/**
 * 客户主数据Dto对象。
 *
 * @author DongLiusuo
 * @date 2025-01-08
 */
@Schema(description = "客户主数据Dto对象")
@Data
public class CustomerInfoDto {

    /**
     * 唯一标识符。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "唯一标识符。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，唯一标识符不能为空！", groups = {UpdateGroup.class})
    private Long customerId;

    /**
     * 名。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "名。可支持等于操作符的列表数据过滤。")
    private String firstName;

    /**
     * 姓。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "姓。可支持等于操作符的列表数据过滤。")
    private String lastName;

    /**
     * 电子邮件。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "电子邮件。可支持等于操作符的列表数据过滤。")
    private String email;

    /**
     * 电话号码。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "电话号码。可支持等于操作符的列表数据过滤。")
    private String phoneNumber;

    /**
     * 性别。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "性别。可支持等于操作符的列表数据过滤。")
    @ConstDictRef(constDictClass = Gender.class, message = "数据验证失败，性别为无效值！")
    private String gender;

    /**
     * 出生日期。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "出生日期。可支持等于操作符的列表数据过滤。")
    private Date birthDate;

    /**
     * 证件类型。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "证件类型。可支持等于操作符的列表数据过滤。")
    @ConstDictRef(constDictClass = CertType.class, message = "数据验证失败，证件类型为无效值！")
    private String idType;

    /**
     * 证件号码。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "证件号码。可支持等于操作符的列表数据过滤。")
    private String idNumber;

    /**
     * 国籍。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "国籍。可支持等于操作符的列表数据过滤。")
    private String nationality;

    /**
     * 省行政区划代码。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "省行政区划代码。可支持等于操作符的列表数据过滤。")
    private String provinceCode;

    /**
     * 市行政区划代码。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "市行政区划代码。可支持等于操作符的列表数据过滤。")
    private String cityCode;

    /**
     * 区行政区划代码。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "区行政区划代码。可支持等于操作符的列表数据过滤。")
    private String districtCode;

    /**
     * 详细地址1。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "详细地址1。可支持等于操作符的列表数据过滤。")
    private String detailedAddress1;

    /**
     * 详细地址2。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "详细地址2。可支持等于操作符的列表数据过滤。")
    private String detailedAddress2;

    /**
     * 完整地址。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "完整地址。可支持等于操作符的列表数据过滤。")
    private String fullAddress;

    /**
     * 职业。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "职业。可支持等于操作符的列表数据过滤。")
    private String occupation;

    /**
     * 公司名称。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "公司名称。可支持等于操作符的列表数据过滤。")
    private String companyName;

    /**
     * 收入范围。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "收入范围。可支持等于操作符的列表数据过滤。")
    private String incomeRange;

    /**
     * 紧急联系人姓名。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "紧急联系人姓名。可支持等于操作符的列表数据过滤。")
    private String emergencyContactName;

    /**
     * 紧急联系人电话。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "紧急联系人电话。可支持等于操作符的列表数据过滤。")
    private String emergencyContactPhone;

    /**
     * 注册日期。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "注册日期。可支持等于操作符的列表数据过滤。")
    private Date registrationDate;

    /**
     * 最后登录时间。
     */
    @Schema(description = "最后登录时间。")
    private Date lastLogin;

    /**
     * 用户状态。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "用户状态。可支持等于操作符的列表数据过滤。")
    private String status;

    /**
     * 其他备注信息。
     */
    @Schema(description = "其他备注信息。")
    private String remark;

    /**
     * birthDate 范围过滤起始值(>=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "birthDate 范围过滤起始值(>=)。可支持范围操作符的列表数据过滤。")
    private String birthDateStart;

    /**
     * birthDate 范围过滤结束值(<=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "birthDate 范围过滤结束值(<=)。可支持范围操作符的列表数据过滤。")
    private String birthDateEnd;

    /**
     * registrationDate 范围过滤起始值(>=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "registrationDate 范围过滤起始值(>=)。可支持范围操作符的列表数据过滤。")
    private String registrationDateStart;

    /**
     * registrationDate 范围过滤结束值(<=)。
     * NOTE: 可支持范围操作符的列表数据过滤。
     */
    @Schema(description = "registrationDate 范围过滤结束值(<=)。可支持范围操作符的列表数据过滤。")
    private String registrationDateEnd;

    /**
     * first_name / last_name / email / phone_number / id_number LIKE搜索字符串。
     * NOTE: 可支持LIKE操作符的列表数据过滤。
     */
    @Schema(description = "LIKE模糊搜索字符串")
    private String searchString;
}
